<?php
	/*
		$request = new GP_secure();
		$request -> setMode(GET | POST);
		$request -> setMode(GET | POST | SESSION);
		$form = $request -> fabric_form();
		$var = $request -> Get('nom', ['value_by_default']);
		$bool = $request -> Booleen('nom', ['false' / 'true']);
		$bool = $request -> OuiNon('nom', ['Y' / 'NO']);
		$num = $request -> Nombre('nom', [5]);
		$letter = $request -> Lettre('nom', ['A']);
		$request -> Texte('nom', ['texte_par_defaut']);
		$request -> Couleur('nom', ['couleur_par_defaut']);
		// FR : 06-2004 ; 1-4-04 ; 2004 valide
		// EN : 2004-06 ; 04-4-1 ; 2004 valide
		$date = $request -> Date('nom', ['EN' / 'FR', 'date_par_defaut']);
		$date = $request -> VerifDate('nom', ['EN' / 'FR', 'date_par_defaut']);
		$var = $request -> Liste('nom', array('val1, 'val2'), ['valeur_par_defaut']);
		$mail = $request -> Mail('nom', ['valeur_par_defaut']);
		$mails = $request -> Mails('nom', ['valeur_par_defaut']);
		$url = $request -> URL('nom', ['valeur_par_defaut']);
	*/



	define('GET', 0x01);
	define('POST', 0x02);
	define('COOKIE', 0x04);
	define('REQUEST', 0x07);
	define('SESSION', 0x08);
	define('GLOBALS', 0x10);


	class GP_secure 
	{
		static $_instance;
		var $DATA;
		var $magic_quotes_gpc;

		// singleton
		public function &getInstance() 
		{
			if (!self::$_instance instanceof self)
				self::$_instance = new self();
			return self::$_instance;
		}
		
		function __construct() 
		{
			$mode = GET | POST;
			$this -> setMode($mode);
			$this -> magic_quotes_gpc = get_magic_quotes_gpc() ? 1 : 0;
		}


		function setMode($mode) 
		{
			$i = 0;
			$this -> DATA = array();

			if ($mode & GLOBALS)
				$this -> DATA[$i++] = &$GLOBALS;

			if ($mode & SESSION)
				$this -> DATA[$i++] = &$_SESSION;

			if (($mode & REQUEST) == REQUEST)
				$this -> DATA[$i++] = &$_REQUEST;
			else 
			{
				if ($mode & GET)
					$this -> DATA[$i++] = &$_GET;

				if ($mode & POST)
					$this -> DATA[$i++] = &$_POST;

				if ($mode & COOKIE)
					$this -> DATA[$i++] = &$_COOKIE;
			}
		}

		function fabric_form() 
		{
			$retour = '';

			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				while (list ($cle, $valeur) = each($this -> DATA[$i])) 
				{
					if (($cle <> 'auth') && ($cle <> 'login') && ($cle <> 'password')) 
					{
						if (is_array($this -> DATA[$i][$cle])) {
							$array = $this -> DATA[$i][$cle];

							while (list ($sub_cle, $sub_valeur) = each($array)) 
							{
								$sub_valeur = stripslashes($sub_valeur);

								$sub_valeur = str_replace("\"", "&quot;", $sub_valeur);
								$sub_valeur = str_replace("<", "&lt;", $sub_valeur);
								$sub_valeur = str_replace(">", "&gt;", $sub_valeur);

								$retour .= '<input type="hidden" name="'.($cle).'['.($sub_cle).']" value="'.($sub_valeur).'" />'."\n";
							}

						}
						else 
						{
							$valeur = stripslashes($valeur);
		
							$valeur = str_replace("\"", "&quot;", $valeur);
							$valeur = str_replace("<", "&lt;", $valeur);
							$valeur = str_replace(">", "&gt;", $valeur);
		
							$retour .= '<input type="hidden" name="'.($cle).'" value="'.($valeur).'" />'."\n";
						}
					}
				}
			}

			return $retour;
		}


		function Get($nom, $defaut = null) 
		{
			$nb_data = count($this -> DATA);
			$valeur = null;
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];

				if ($valeur <> null)
					return $valeur;
			}

			return $defaut;
		}


		function Booleen($nom, $defaut = 'false') 
		{
			$nb_data = count($this -> DATA);
			$valeur = null;
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];

				$valeur = trim($valeur);
				
				if ($valeur <> null) 
				{
					if ($valeur == 'true')
						return 'true';
					else if ($valeur == 'false')
						return 'false';
					else
						return $defaut;
				}
			}

			return $defaut;
		}


		function OuiNon($nom, $defaut = 'N') 
		{
			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++)
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];
				
				$valeur = trim($valeur);

				if ($valeur <> null) 
				{
					if ($valeur == 'Y')
						return 'Y';
					else if ($valeur == 'N')
						return 'N';
					else
						return $defaut;
				}
			}

			return $defaut;
		}


		function Nombre($nom, $defaut = 0) 
		{
			$nb_data = count($this -> DATA);
			for ($i = 0 ;  $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];

				$valeur = trim($valeur);
				$valeur = str_replace(' ', '', $valeur);

				if ($valeur <> null) 
				{
					if (ereg('[0-9]+', $valeur))
						return $valeur;
					else
						return $defaut;
				}
			}

			return $defaut;
		}


		function Lettre($nom, $defaut = '') 
		{
			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];
				
				$valeur = trim($valeur);

				if ($valeur <> null) 
				{
					if (ereg('[a-zA-Z]', $valeur) && (strlen($valeur) == 1))
						return $valeur;
					else
						return $defaut;
				}
			}

			return $defaut;
		}


		function Couleur($nom, $defaut = '#FFFFFF') 
		{
			$nb_data = count($this -> DATA);
			for ($i = 0; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];
				
				$valeur = trim($valeur);

				if ($valeur <> null) 
				{
					if ($valeur[0] <> '#')
						$valeur = '#'.$valeur;
						
					if (ereg('^#[0-9ABCDEF]+', $valeur) && (strlen($valeur) == 7))
						return $valeur;
					else
						return $defaut;
				}
			}
			return $defaut;
		}


		function Texte($nom, $defaut = '') 
		{
			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];

				if ($valeur <> null) {
					$valeur = trim($valeur);

					// Supprimer tabulation
					$valeur = str_replace("\t", "", $valeur);

					// Supprimer lignes vides
					$valeur = ereg_replace("^[ \r\n\t]+", "", $valeur);
					$valeur = ereg_replace("[ \r\n\t]+$", "", $valeur);

					// Supprimer double espace
					$valeur = ereg_replace('[ ]+', ' ', $valeur);

					// Remplacer quelques caractères
					$valeur = str_replace('`', "\'", $valeur);
					$valeur = str_replace('¿', "\'", $valeur);
					$valeur = str_replace('&#339;', "oe", $valeur);
					$valeur = str_replace('&#8211;', "-", $valeur);
					$valeur = str_replace('&#8217;', "\'", $valeur);
					$valeur = str_replace('&#8364;' , "EU", $valeur);

					if ($valeur <> '')
						return $valeur;
					else
						return $defaut;
				}
			}

			return $defaut;
		}


		function ValiderChaine($chaine, $bool) 
		{
			$conv = array(
				chr(129) => '',
				chr(130) => '‚', // apostrophe anglaise basse
				chr(131) => 'ƒ', // florin, forte musical
				chr(132) => '„', // guillemet anglais bas
				chr(133) => '…', // points de suspension
				chr(134) => '†', // obèle, dague, croix (renvoi de notes de bas de page)
				chr(135) => '‡', // double croix
				chr(136) => 'ˆ', // accent circonflexe
				chr(137) => '‰', // pour mille
				chr(138) => 'Š', // S majuscule avec caron (accent circonflexe inversé) utilisé en tchèque
				chr(139) => '‹', // guillemet simple allemand et suisse, parenthèse angulaire ouvrante
	//			chr(140) => 'Œ', // Ligature o-e majuscule
				chr(141) => '',
				chr(142) => '',
				chr(143) => '',
				chr(144) => '',
				chr(145) => '‘', // guillemet anglais simple ouvrant(utilisé dans les guillemets doubles)
				chr(146) => '’', // guillemet anglais simple fermant(utilisé dans les guillemets doubles)
				chr(147) => '“', // guillemets anglais doubles ouvrants
				chr(148) => '”', // guillemets anglais doubles fermants
				chr(149) => '•', // boulet
				chr(150) => '–', // tiret demi-cadratin (incise)
				chr(151) => '—', // tiret cadratin (dialogue)
				chr(152) => '˜', // tilde
	//			chr(153) => '™', // marque déposée
				chr(154) => 'š', // s minuscule avec caron (accent circonflexe inversé) utilisé en tchèque
				chr(155) => '›', // guillemet simple allemand et suisse, parenthèse angulaire fermante
	//			chr(156) => 'œ', // Ligature o-e minscule
				chr(157) => '',
				chr(158) => '', // z minuscule avec caron (accent circonflexe inversé) utilisé en tchèque.
				chr(159) => 'Ÿ' // Y majuscule avec trema, présent en français dans quelques noms propres
			);

			if (!$conform) 
			{
				$conv[chr(130)] = '\''; // apostrophe
				$conv[chr(145)] = '\''; // apostrophe
				$conv[chr(146)] = '\''; // apostrophe
				$conv[chr(132)] = '"'; // guillemet
				$conv[chr(139)] = '"'; // guillemet
				$conv[chr(155)] = '"'; // guillemet
				$conv[chr(147)] = '"'; // guillemet
				$conv[chr(148)] = '"'; // guillemet
				$conv[chr(150)] = '-'; // tiret
				$conv[chr(151)] = '-'; // tiret
				$conv[chr(133)] = '...'; // points de suspension
			}

			return str_replace(array_keys($conv), array_values($conv), $chaine);	
		}


		function Temps($nom, $defaut = null) 
		{
			$resultat = '';

			if ($defaut === null)
				$defaut = '00:00:00';
		
			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];
				$valeur = trim($valeur);

				if ($valeur <> null) 
				{
					if (ereg('^([0-9]{2})([:]{1})([0-9]{2})([:]{1})([0-9]{2})$', $valeur))
						$resultatat = $valeur;
					else if (ereg('^([0-9]{2})([:]{1})([0-9]{2})$', $valeur))
						$resultatat = $valeur.':00';
					else if (ereg('^([0-9]{2})$', $valeur))
						$resultatat = $valeur.':00:00';
					else
						return $defaut;
						
					list ($heure, $minute, $seconde) = split(':', $resultatat);
					
					if ($heure > 24)		
						$heure = 23;
					if ($minute > 59)	
						$minute = 59;
					if ($seconde > 59)	
						$seconde = 59;
					
					$resultatat = sprintf('%02d:%02d:%02d', $heure, $minute, $seconde);

					return $resultatat;
				}
			}

			return $defaut;
		}
		
		
		function Date($nom, $langue = 'FR', $defaut = null) 
		{
			$resultat = '';

			if ($defaut === null)
				$defaut = (strtoupper($langue) == 'FR') ? '00-00-0000' : '0000-00-00';

			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];
				
				$valeur = trim($valeur);

				if ($valeur <> null) 
				{
					if ($langue == 'FR') 
					{
						if (ereg('^([0-9]{1,2})([-/]{1})([0-9]{1,2})([-/]{1})([0-9]{2,4})$', $valeur))
							$resultat = $valeur;
						else if (ereg('^([0-9]{1,2})([-/]{1})([0-9]{2,4})$', $valeur))
							$resultat = '00-'.$valeur;
						else if (ereg('^([0-9]{2,4})$', $valeur))
							$resultat = '00-00-'.$valeur;
						else
							return $defaut;

						list ($jour, $mois, $annee) = split('[-/]', $resultat);
						
						if (strlen($annee) < 4)
							$annee += 2000;
						
						$resultat = sprintf('%02d-%02d-%04d', $jour, $mois, $annee);

						return $resultat;
					}
					else 
					{
						if (ereg('^([0-9]{2,4})([-/]{1})([0-9]{1,2})([-/]{1})([0-9]{1,2})$', $valeur))
							$resultat = $valeur;
						else if (ereg('^([0-9]{2,4})([-/]{1})([0-9]{1,2})$', $valeur))
							$resultat = $valeur.'-00';
						else if (ereg('^([0-9]{2,4})$', $valeur))
							$resultat = $valeur.'-00-00';
						else
							return $defaut;
							
						list ($annee, $mois, $jour) = split('[-/]', $resultat);
						
						if (strlen($annee) < 4)
							$annee += 2000;

						$resultat = sprintf('%04d-%02d-%02d', $annee, $mois, $jour);

						return $resultat;
					}
				}
			}

			return $defaut;
		}


		function VerifDate($nom, $langue = 'FR', $defaut = null) 
		{
			$resultat = '';

			if ($defaut === null)
				$defaut = (strtoupper($langue) == 'FR') ? '00-00-0000' : '0000-00-00';

			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];

				$valeur = trim($valeur);
				
				if ($valeur <> null) 
				{
					if ($langue == 'FR') 
					{
						if (ereg('^([0-9]{1,2})([-/]{1})([0-9]{1,2})([-/]{1})([0-9]{2,4})$', $valeur))
							$resultat = $valeur;
						else
							return $defaut;

						if (ereg('^([0-9]{1,2})([-/]{1})([0-9]{1,2})([-/]{1})([0-9]{2,4})$', $valeur, $regs))
							if (VerifDate($regs[3], $regs[1], $regs[5]))
								return ($regs[1]).'-'.($regs[3]).'-'.($regs[5]);

						return $defaut;
					}
					else 
					{
						if (ereg('^([0-9]{2,4})([-/]{1})([0-9]{1,2})([-/]{1})([0-9]{1,2})$', $valeur))
							$resultat = $valeur;
						else
							return $defaut;

						if (ereg('^([0-9]{2,4})([-/]{1})([0-9]{1,2})([-/]{1})([0-9]{1,2})$', $valeur, $regs))
							if (VerifDate($regs[3], $regs[5], $regs[1]))
								return ($regs[1]).'-'.($regs[3]).'-'.($regs[5]);

						return $defaut;
					}
				}
			}

			return $defaut;
		}


		function Liste($nom, $liste, $defaut = '') 
		{
			if (!is_array($liste))
				$liste = array($liste);

			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];

				if ($valeur <> null) 
				{
					if (in_array($valeur, $liste))
						return $valeur;
					else
						return $defaut;
				}
			}

			return $defaut;
		}


		function Mail($nom, $defaut = '') 
		{
			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];

				if ($valeur <> null) 
				{
					$valeur = trim($valeur);

					if (ereg(".*<(.+)>", $valeur, $regs))
						$mail = $regs[1];
					else
						$mail = $valeur;

					if (ereg("^([a-zA-Z0-9\.\_-]+)@([a-zA-Z0-9\_-]+\.)+([a-zA-Z0-9\_-]{2,4}|museum)\$", $mail))
						return $valeur;
					else
						return $defaut;
				}
			}

			return $defaut;
		}


		function Mails($nom, $defaut = '') 
		{
			$nb_data = count($this -> DATA);
			for ($i = 0 ; $i < $nb_data ; $i++) 
			{
				if (count($this -> DATA[$i][$nom]))
					$tab = $this -> DATA[$i][$nom];

				if ($tab <> null) 
				{
					$tab = split(',', $tab);
					
					while (list ($cle, $valeur) = each($tab)) 
					{
						$valeur = trim($valeur);

						if (ereg(".*<(.+)>", $valeur, $regs))
							$mail = $regs[1];
						else
							$mail = $valeur;

						if (ereg("^([a-zA-Z0-9\.\_-]+)@([a-zA-Z0-9\_-]+\.)+([a-zA-Z0-9\_-]{2,4}|museulm)\$", $mail))
							$tab[$cle] = $valeur;
						else
							return $defaut;
					}

					$tab = implode(', ', $tab);

					return $tab;
				}
			}

			return $defaut;
		}


		function URL($nom, $defaut = 'http://') 
		{
			$nb_data = count($this -> DATA);
			for ($i = 0; $i < $nb_data ; $i++) 
			{
				if (isset($this -> DATA[$i][$nom]))
					$valeur = $this -> DATA[$i][$nom];

				if ($valeur <> null) 
				{
					$valeur = trim($valeur);

					$valeur = htmlentities($valeur);
					
					if (ereg("^(http[s]?\:\/\/\/)(.*)\$", $valeur))
						return $defaut;
					else if (ereg("^(http[s]?\:\/\/)([a-zA-Z0-9\_\/\.-]+)\$", $valeur))
						return $valeur;
					else
						return $defaut;

				}
			}

			return $defaut;
		}
	}
?>